import * as fs from 'fs-extra';
import * as path from 'path';
import * as readline from 'readline';

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

// 递归处理文件夹和文件
async function processDirectory(dirPath: string, moduleName: string) {
  const items = await fs.readdir(dirPath);

  for (const item of items) {
    const itemPath = path.join(dirPath, item);
    const stats = await fs.stat(itemPath);

    if (stats.isDirectory()) {
      // 处理文件夹名称
      const newItemName = item
        .replace(/temp/g, moduleName.toLowerCase())
        .replace(
          /Temp/g,
          moduleName.charAt(0).toUpperCase() + moduleName.slice(1),
        );
      // .replace(/TEMP/g, moduleName.toUpperCase());

      const newItemPath = path.join(dirPath, newItemName);

      // 如果文件夹名称需要更改
      if (item !== newItemName) {
        await fs.rename(itemPath, newItemPath);
        // 递归处理新路径
        await processDirectory(newItemPath, moduleName);
      } else {
        // 递归处理原路径
        await processDirectory(itemPath, moduleName);
      }
    } else if (stats.isFile()) {
      // 处理文件内容
      let content = await fs.readFile(itemPath, 'utf8');

      // 替换小写的 temp 为小写的模块名
      content = content.replace(/temp/g, moduleName.toLowerCase());
      // 替换大写的 Temp 为大写的模块名
      content = content.replace(
        /Temp/g,
        moduleName.charAt(0).toUpperCase() + moduleName.slice(1),
      );
      // 替换 TEMP 为大写的模块名
      // content = content.replace(/TEMP/g, moduleName.toUpperCase());

      await fs.writeFile(itemPath, content);

      // 处理文件名
      const newItemName = item
        .replace(/temp/g, moduleName.toLowerCase())
        .replace(
          /Temp/g,
          moduleName.charAt(0).toUpperCase() + moduleName.slice(1),
        );
      // .replace(/TEMP/g, moduleName.toUpperCase());

      if (item !== newItemName) {
        const newItemPath = path.join(dirPath, newItemName);
        await fs.rename(itemPath, newItemPath);
      }
    }
  }
}

// 获取模块名称
rl.question('请输入新模块名称: ', async (moduleName) => {
  try {
    const sourceDir = path.join(__dirname, '../template/module-template');
    const targetDir = path.join(__dirname, '../src/modules', moduleName);

    // 检查目标目录是否已存在
    if (fs.existsSync(targetDir)) {
      console.error(`错误: 模块 "${moduleName}" 已存在`);
      rl.close();
      return;
    }

    // 复制模板文件
    await fs.copy(sourceDir, targetDir);

    // 处理所有文件夹和文件
    await processDirectory(targetDir, moduleName);

    console.log(`✅ 模块 "${moduleName}" 创建成功！`);
    console.log(`📁 位置: ${targetDir}`);
  } catch (error) {
    console.error('创建模块时出错:', error);
  } finally {
    rl.close();
  }
});
